Android 注解有意思

个人对注解的理解是一种说明,对于代码本身的、具有真正限制性的说明。此处只针对于 Android 本身固有的注解及其自定义的使用。

Android 固有注解

Java 注解已经有很多篇优秀文章讲解过了,此处不再赘述,想看的同学戳这里,这篇博客也参考了网上的相关资源,我所做的就是在代码证实际使用验证一下效果。下面简述其分类

1. Null 相关,此类注解 Android 中很常见,不再赘述

  • @Nullable:可为 null
  • @NonNull:不可为 null

2. Resource Type 相关:用于引用各相关资源时进行编译期检查,因各资源引用时都是整数值,通过该注解检查就能避免不小心引起的错误引用;命名上使用”资源类型名+Res”的方式,如:IntRes、AnimRes 等,具体如下:

  • AnimatorRes/AnimRes:Animator/Anim 资源类型
  • AnyRes:任意资源类型
  • ArrayRes:array 资源类型
  • AttrRes:attr 资源类型
  • BoolRes/IntegerRes/StringRes:Boolean/Integer/String 资源类型
  • Dimen:dimen 资源类型
  • ColorRes:color 资源类型,此外:希望通过 RGB 调色时可使用 @ColorInt
  • DrawableRes:drawable 资源类型
  • FrictionRes:friction 资源类型
  • IdRes:id 资源类型
  • InterpolatorRes:interpolator 资源类型
  • LayoutRes:layout 资源类型
  • MenuRes:menu 资源类型
  • PluralsRes:plurals 资源类型
  • RawRes:raw 资源类型
  • StyleableRes/StyleRes:styleable/style 资源类型
  • TransitionRes:transition 资源类型
  • XmlRes:xml 资源类型

引用错误的资源时 IDE 会给出提示,但不影响构建和部署

###3. Thread 相关:可指定在何种线程中运行(Ps:代码中实际使用了一下并没有什么提示,不知道是什么鬼=_=)

  • UIThread:UI 线程
  • MainThread:主线程
  • WorkerThread:子线程/工作线程
  • BinderThread:绑定线程

###4. 枚举相关:可指定默认的枚举类型,非指定类型(即便基本类型一致)入参编译不通过;使用 IntDef 时该种方式对于变量无能为力,只能传入指定参数;若想不检查变量,可使用 IntRange指定参数范围即可

  • IntDef:int 枚举
  • StringDef:string 枚举

###5. 一定范围限制相关

  • Size:限制集合、数组的大小和倍数以及字符串的长度
  • IntRange:int 范围
  • FloatRange:float 范围

###6. Permission相关:@RequiresPermission

  • 指定方法需要的具体权限:

    @RequiresPermission(Manifest.permission.INTERNET)
    
  • 需要几个权限中的一种:anyOf

    @RequiresPermission(anyOf = {Manifest.permission.INTERNET, Manifest.permission.CAMERA})
    
  • 同时需要多个权限:allOf

    @RequiresPermission(allOf = {Manifest.permission.INTERNET, Manifest.permission.CAMERA})
    
  • 对于 intent 的权限可直接在其相应的常量字符串字段上标注权限需求

    @RequiresPermission(android.Manifest.permission.BLUETOOTH)
    public static final String ACTION_REQUEST_DISCOVERABLE = "android.bluetooth.adapter.action.REQUEST_DISCOVERABLE";
    
  • 对于 ContentProvider 的权限,需要单独使用 @Read、@Write 来标注读、写的访问权限

    @RequiresPermission.Read(@RequiresPermission(READ_HISTORY_BOOKMARKS))
    @RequiresPermission.Write(@RequiresPermission(WRITE_HISTORY_BOOKMARKS))
    public static final Uri BOOKMARKS_URI = Uri.parse("content://browser/bookmarks");
    

###7. 重写相关:@CallSuper,强制某一方法在重写时调用其父类方法,如 Activity 的 onCreate();若为使用时未重写父类方法会给出提示

@CallSuper
protected void onCreate(@Nullable Bundle savedInstanceState)

###8. 方法返回值相关:@CheckResult,希望提示调用者使用方法的返回值,调用者未使用时会给出提示

@CheckResult
public Build setPostType(int type){
      mIntent.putExtra(FeedPostActivity.TYPE_FEED_POST, type);
      return this;
}    

自定义注解及其简单应用,此处以 @IntRange 作为示例;自定义注解 @PostType,作用是确定参数的整数范围,可以使用 int 值或对应的 int 常量,检查时只检查 int 值本身

传入范围之外的值时 IDE 会提示,但是不影响运行

使用常量值替代更利于阅读,效果同上

有什么想说的可以联系我,欢迎骚扰

本站总访问量